/*
 * @ Dmitry Farafonov
 */

(function ($) {
  $.ProgressBar = function (options) {
    this.element = $(options.boundingBox);
    if (options.on && options.on.complete) {
      this.onComplete = options.on.complete;
    }
    if (options.on && options.on.valueChange) {
      this.onValueChange = options.on.valueChange;
    }

    this._create();

    if (options.label) this.set('label', options.label);
    if (options.value) this.value(options.value);
    if (options.max) this.set('max', options.max);
  };
  $.ProgressBar.prototype = {
    options: {
      value: 0,
      max: 100,
    },

    min: 0,

    _create: function () {
      this.element.addClass('ui-progressbar ui-widget ui-widget-content ui-corner-all').attr({
        role: 'progressbar',
        'aria-valuemin': this.min,
        'aria-valuemax': this.options.max,
        'aria-valuenow': this._value(),
      });

      this.valueDiv = $("<div class='ui-progressbar-label'></div>").appendTo(this.element);

      this.valueDiv = $("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element);

      this.oldValue = this._value();
      this._refreshValue();
    },

    _destroy: function () {
      this.element
        .removeClass('ui-progressbar ui-widget ui-widget-content ui-corner-all')
        .removeAttr('role')
        .removeAttr('aria-valuemin')
        .removeAttr('aria-valuemax')
        .removeAttr('aria-valuenow');

      this.valueDiv.remove();
    },

    value: function (newValue) {
      if (newValue === undefined) {
        return this._value();
      }

      this._setOption('value', newValue);
      return this;
    },

    _setOption: function (key, value) {
      if (key === 'value') {
        //var oldVal = this.options.value;
        this.options.value = value;
        this._refreshValue();

        if (this.onValueChange) this.onValueChange.apply(this, [{ oldVal: this.oldValue, newVal: value }]);

        if (this._value() === this.options.max) {
          //this._trigger( "complete" );
          if (this.onComplete) this.onComplete.apply(this);
        }
      } else if (key === 'label') {
        $(this.element).find('.ui-progressbar-label').html(value);
      } else if (key === 'max') {
        this.options.max = value;
      }

      //this._super( key, value );
    },

    _value: function () {
      var val = this.options.value;
      // normalize invalid value
      if (typeof val !== 'number') {
        val = 0;
      }
      return Math.min(this.options.max, Math.max(this.min, val));
    },

    _percentage: function () {
      return (100 * this._value()) / this.options.max;
    },

    _refreshValue: function () {
      var value = this.value(),
        percentage = this._percentage();

      if (this.oldValue !== value) {
        this.oldValue = value;
        //this._trigger( "change" );
      }

      this.valueDiv
        .toggle(value > this.min)
        .toggleClass('ui-corner-right', value === this.options.max)
        .width(percentage.toFixed(0) + '%');
      this.element.attr('aria-valuenow', value);

      //$(this.element).find(".ui-progressbar-label").html(value + "%");
    },

    set: function (key, value) {
      this._setOption(key, value);
    },
  };
})(jQuery);
